/*
 * Funambol is a mobile platform developed by Funambol, Inc. 
 * Copyright (C) 2008 Funambol, Inc.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission 
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE 
 * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License 
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 * 
 * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite 
 * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
 * 
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * 
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by Funambol" logo. If the display of the logo is not reasonably 
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by Funambol".
 */

#ifndef INCL_FUN_DATE
#define INCL_FUN_DATE
    
#include "base/util/StringBuffer.h"
#include "Timezone.h"
#include "constants.h"
#include "TimeUtils.h"

using namespace Funambol;

class Date {

private:
    
    /**
    * The StringBuffer repesenting the date in a stirng format
    */
    StringBuffer date;   
    
    /**
     * The timezone associated to the current date. the local date must be converted using the 
     * timezone associated to the date. If not set the current locale is used.
     */
    Timezone tz;
    
public:
    
    /**
    * The default constructor that is with empty date
    */
    Date() { 
        date = EMPTY_DATE;    
    }
    /**
    * The date StringBuffer could be in the format
    * yyyyMMddTHHmmssZ      UTC
    * yyyyMMddTHHmmss       local
    * yyyyMMdd              only date information
    * 
    * @param date   the date in a string format
    * 
    */
    Date(const char* d) {
        date = d; 
        // the timezone is the default
    }
    
    /**
    * The date StringBuffer could be in the format
    * yyyyMMddTHHmmssZ      UTC
    * yyyyMMddTHHmmss       local
    * yyyyMMdd              only date information
    *
    * @param date      the date in a string format
    * @param timezone  the
    * 
    */
    Date(const char* d, Timezone& timezone) {
        date = d;
        tz = timezone;        
    }
    
    /**
    * It creates a date and convert into a date with the specific Timezone 
    */
    Date(const Date& d) {
        date = d.date;
        tz = d.getTimezone();
    }
    
    /**
    * Destructor
    */
    ~Date() {}
    
    /**
    * It converts the current values in the Date using the specific
    * Timezone. It saves the timezone internally to be consistent with 
    * the date itself
    *
    * @param timezone   the Timezone to be used to convert the date
    * @return   true if the conversion is ok. false otherwise
    * 
    * @todo: to be implemented
    */
    bool convertToSpecificTz(Timezone& timezone) { return false;}
    
    /**
    * Return the date stored in the class
    */
    const char* getDate() const { return date.c_str(); }
    
    /**
    * Overwrite the date with the passed one
    *
    * @param d the date to be stored in string format
    */
    void setDate(const char* d) { date = d; }
    
    /**
     * Overwrite the date with the passed one
     *
     * @param d the date to be stored in string format
     */
    void setTimezone(Timezone& t) { tz = t; }
    
    /**
     * Return the timezone obj that is in the dat object
     */
     const Timezone& getTimezone() const { return tz; }
    
    /**
    * Equal operator. Timezone not considered yet
    */    
    bool operator== (const Date& d) {
        StringBuffer dd = d.getDate();
        return (date == dd);
    }
    
    /**
     * Equal operator. Timezone not considered yet
     */    
    bool operator!= (const Date& d) {
        return !(*this == d);
    }    
    
    Date operator= (const Date& d) {
        if (this == &d) {
           return *this;
        }
        date = d.getDate();  
        tz = d.getTimezone();
        return *this;          
    }
    
};  
 
#endif

